{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Feature Selection Techniques\n",
    "\n",
    "<hr>\n",
    "\n",
    "### Agenda\n",
    "1. Introduction to Feature Selection\n",
    "2. VarianceThreshold\n",
    "3. Chi-squared stats\n",
    "4. ANOVA using f_classif\n",
    "5. Univariate Linear Regression Tests using f_regression\n",
    "6. F-score vs Mutual Information\n",
    "7. Mutual Information for discrete value\n",
    "8. Mutual Information for continues value\n",
    "9. SelectKBest\n",
    "10. SelectPercentile\n",
    "11. SelectFromModel\n",
    "12. Recursive Feature Elemination\n",
    "\n",
    "<hr>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. Introduction to Feature Selection\n",
    "* Selecting features from the dataset\n",
    "* Improve estimator's accuracy\n",
    "* Boost preformance for high dimensional datsets\n",
    "* Below we will discuss univariate selection methods\n",
    "* Also, feature elimination method"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn import feature_selection\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. VarianceThreshold\n",
    "* Drop the columns whose variance is below configured level\n",
    "* This method is unsupervised .i.e target not taken into action\n",
    "* Intution : Columns whose values arn't petty much the same won't have much impact on target"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.DataFrame({'A':['m','f','m','m','m','m','m','m'], \n",
    "              'B':[1,2,3,1,2,1,1,1], \n",
    "              'C':[1,2,3,1,2,1,1,1]})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>m</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>f</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>m</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>m</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>m</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>m</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>m</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>m</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   A  B  C\n",
       "0  m  1  1\n",
       "1  f  2  2\n",
       "2  m  3  3\n",
       "3  m  1  1\n",
       "4  m  2  2\n",
       "5  m  1  1\n",
       "6  m  1  1\n",
       "7  m  1  1"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import LabelEncoder\n",
    "le = LabelEncoder()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "df['A'] = le.fit_transform(df.A)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   A  B  C\n",
       "0  1  1  1\n",
       "1  0  2  2\n",
       "2  1  3  3\n",
       "3  1  1  1\n",
       "4  1  2  2\n",
       "5  1  1  1\n",
       "6  1  1  1\n",
       "7  1  1  1"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "vt = feature_selection.VarianceThreshold(threshold=.2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 1],\n",
       "       [2, 2],\n",
       "       [3, 3],\n",
       "       [1, 1],\n",
       "       [2, 2],\n",
       "       [1, 1],\n",
       "       [1, 1],\n",
       "       [1, 1]], dtype=int64)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vt.fit_transform(df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.109375, 0.5     , 0.5     ])"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vt.variances_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. Chi-Square for Non-negative feature & class\n",
    "* Feature data should be booleans or count\n",
    "* Supervised technique for feature selection\n",
    "* Target should be discrete"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.read_csv('tennis.csv.txt')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "for col in df.columns:\n",
    "    le = LabelEncoder()\n",
    "    df[col] = le.fit_transform(df[col])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>outlook</th>\n",
       "      <th>temp</th>\n",
       "      <th>humidity</th>\n",
       "      <th>windy</th>\n",
       "      <th>play</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    outlook  temp  humidity  windy  play\n",
       "0         2     1         0      0     0\n",
       "1         2     1         0      1     0\n",
       "2         0     1         0      0     1\n",
       "3         1     2         0      0     1\n",
       "4         1     0         1      0     1\n",
       "5         1     0         1      1     0\n",
       "6         0     0         1      1     1\n",
       "7         2     2         0      0     0\n",
       "8         2     0         1      0     1\n",
       "9         1     2         1      0     1\n",
       "10        2     2         1      1     1\n",
       "11        0     2         0      1     1\n",
       "12        0     1         1      0     1\n",
       "13        1     2         0      1     0"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "chi2, pval = feature_selection.chi2(df.drop('play',axis=1),df.play)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([2.02814815, 0.02222222, 1.4       , 0.53333333])"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chi2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* Higher value means more important feature for target"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4. ANOVA using f_classif\n",
    "* For feature variables continues in nature\n",
    "* And, target variable discrete in nature\n",
    "* Internally, this method uses ratio of variation within a columns & variation across columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import load_breast_cancer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "cancer_data = load_breast_cancer()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = cancer_data.data\n",
    "Y = cancer_data.target"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [],
   "source": [
    "chi2, pval = feature_selection.f_classif(X,Y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([647., 118., 697., 573.,  84., 313., 534., 862.,  70.,   0., 269.,\n",
       "         0., 254., 244.,   3.,  53.,  39., 113.,   0.,   3., 861., 150.,\n",
       "       898., 662., 122., 304., 437., 964., 119.,  66.])"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.round(chi2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* Each value represents importance of a feature"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5. Univariate Regression Test using f_regression\n",
    "* Linear model for testing the individual effect of each of many regressors.\n",
    "* Correlation between each value & target is calculated\n",
    "* F-test captures linear dependency"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import california_housing"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [],
   "source": [
    "house_data = california_housing.fetch_california_housing()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [],
   "source": [
    "X,Y = house_data.data, house_data.target"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [],
   "source": [
    "F, pval = feature_selection.f_regression(X,Y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1.85565716e+04, 2.32841479e+02, 4.87757462e+02, 4.51085756e+01,\n",
       "       1.25474103e+01, 1.16353421e+01, 4.38005453e+02, 4.36989761e+01])"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "F"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* Columns with top F values are the selected features "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 6. F score verses Mutual Information"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(0)\n",
    "X = np.random.rand(1000, 3)\n",
    "y = X[:, 0] + np.sin(6 * np.pi * X[:, 1]) + 0.1 * np.random.randn(1000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([187.42118421,  52.52357392,   0.47268298]),\n",
       " array([3.19286906e-39, 8.50243215e-13, 4.91915197e-01]))"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "feature_selection.f_regression(X,y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x269c7c0a400>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x269c370a5f8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(X[:,0],y,s=10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x269c79b7278>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x269c7a462b0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(X[:,1],y,s=10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 7. Mutual Information for regression using mutual_info_regression\n",
    "* Returns dependency in the scale of 0 & 1 among feature & target\n",
    "* Captures any kind of dependency even if non-linear\n",
    "* Target is continues in nature"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.31431334, 0.86235026, 0.        ])"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "feature_selection.mutual_info_regression(X,y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 8. Mutual Information for classification using mutual_info_classification\n",
    "* Returns dependency in the scale of 0 & 1 among feature & target\n",
    "* Captures any kind of dependency even if non-linear\n",
    "* Target is discrete in nature"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "cols = ['age','workclass','fnlwgt','education','education-num','marital-status','occupation','relationship'\n",
    "        ,'race','sex','capital-gain','capital-loss','hours-per-week','native-country','Salary']\n",
    "adult_data = pd.read_csv('https://raw.githubusercontent.com/zekelabs/data-science-complete-tutorial/master/Data/adult.data.txt', names=cols)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "cat_cols = list(adult_data.select_dtypes('object').columns)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "cat_cols.remove('Salary')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import LabelEncoder"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "for col in cat_cols:\n",
    "    le = LabelEncoder()\n",
    "    adult_data[col]  = le.fit_transform(adult_data[col])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.06756139, 0.01618405, 0.0336902 , 0.06670123, 0.06675714,\n",
       "       0.11178254, 0.06331719, 0.11307409, 0.00615084, 0.02673757,\n",
       "       0.08426718, 0.03138476, 0.04183453, 0.01223693, 0.55248732])"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "feature_selection.mutual_info_classif(adult_data, adult_data.Salary)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['age', 'workclass', 'fnlwgt', 'education', 'education-num',\n",
       "       'marital-status', 'occupation', 'relationship', 'race', 'sex',\n",
       "       'capital-gain', 'capital-loss', 'hours-per-week', 'native-country',\n",
       "       'Salary'],\n",
       "      dtype='object')"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "adult_data.columns"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 9. SelectKBest\n",
    "* SelectKBest returns K important features based on above techniques\n",
    "* Based on configuration, it can use mutual_information or ANOVA or regression based techniques"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>age</th>\n",
       "      <th>workclass</th>\n",
       "      <th>fnlwgt</th>\n",
       "      <th>education</th>\n",
       "      <th>education-num</th>\n",
       "      <th>marital-status</th>\n",
       "      <th>occupation</th>\n",
       "      <th>relationship</th>\n",
       "      <th>race</th>\n",
       "      <th>sex</th>\n",
       "      <th>capital-gain</th>\n",
       "      <th>capital-loss</th>\n",
       "      <th>hours-per-week</th>\n",
       "      <th>native-country</th>\n",
       "      <th>Salary</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>39</td>\n",
       "      <td>7</td>\n",
       "      <td>77516</td>\n",
       "      <td>9</td>\n",
       "      <td>13</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>2174</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>39</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>50</td>\n",
       "      <td>6</td>\n",
       "      <td>83311</td>\n",
       "      <td>9</td>\n",
       "      <td>13</td>\n",
       "      <td>2</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>13</td>\n",
       "      <td>39</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>38</td>\n",
       "      <td>4</td>\n",
       "      <td>215646</td>\n",
       "      <td>11</td>\n",
       "      <td>9</td>\n",
       "      <td>0</td>\n",
       "      <td>6</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>39</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>53</td>\n",
       "      <td>4</td>\n",
       "      <td>234721</td>\n",
       "      <td>1</td>\n",
       "      <td>7</td>\n",
       "      <td>2</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>39</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>28</td>\n",
       "      <td>4</td>\n",
       "      <td>338409</td>\n",
       "      <td>9</td>\n",
       "      <td>13</td>\n",
       "      <td>2</td>\n",
       "      <td>10</td>\n",
       "      <td>5</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   age  workclass  fnlwgt  education  education-num  marital-status  \\\n",
       "0   39          7   77516          9             13               4   \n",
       "1   50          6   83311          9             13               2   \n",
       "2   38          4  215646         11              9               0   \n",
       "3   53          4  234721          1              7               2   \n",
       "4   28          4  338409          9             13               2   \n",
       "\n",
       "   occupation  relationship  race  sex  capital-gain  capital-loss  \\\n",
       "0           1             1     4    1          2174             0   \n",
       "1           4             0     4    1             0             0   \n",
       "2           6             1     4    1             0             0   \n",
       "3           6             0     2    1             0             0   \n",
       "4          10             5     2    0             0             0   \n",
       "\n",
       "   hours-per-week  native-country  Salary  \n",
       "0              40              39       0  \n",
       "1              13              39       0  \n",
       "2              40              39       0  \n",
       "3              40              39       0  \n",
       "4              40               5       0  "
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "adult_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "selector = feature_selection.SelectKBest(k=7, score_func=feature_selection.f_classif)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = selector.fit_transform(adult_data.drop('Salary',axis=1),adult_data.Salary)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1.88670731e+03, 8.69361605e+01, 2.91559359e+00, 2.06129509e+02,\n",
       "       4.12009578e+03, 1.34685178e+03, 1.86500322e+02, 2.18764583e+03,\n",
       "       1.68934788e+02, 1.59310791e+03, 1.70915006e+03, 7.54830452e+02,\n",
       "       1.81338628e+03, 8.17155711e+00])"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "selector.scores_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([  39,   13,    4,    1,    1, 2174,   40], dtype=int64)"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [],
   "source": [
    "selector = feature_selection.SelectKBest(k=7, score_func=feature_selection.mutual_info_classif)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = selector.fit_transform(adult_data.drop('Salary',axis=1),adult_data.Salary)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.06919834, 0.01914811, 0.03206688, 0.0642909 , 0.06570534,\n",
       "       0.11299504, 0.06316131, 0.11589085, 0.00938895, 0.02445832,\n",
       "       0.08181871, 0.03645489, 0.04061038, 0.00618429])"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "selector.scores_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([  39,    9,   13,    4,    1,    1, 2174], dtype=int64)"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data[0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 10. SelectPercentile\n",
    "* Selecting top features whose importances are in configured parameter\n",
    "* Default is top 10 percentile"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [],
   "source": [
    "selector = feature_selection.SelectPercentile(percentile=20, score_func=feature_selection.mutual_info_classif)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = selector.fit_transform(adult_data.drop('Salary',axis=1),adult_data.Salary)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[   4,    1, 2174],\n",
       "       [   2,    0,    0],\n",
       "       [   0,    1,    0],\n",
       "       [   2,    0,    0],\n",
       "       [   2,    5,    0]], dtype=int64)"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data[:5]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 11. SelectFromModel\n",
    "* Selecting important features from model weights\n",
    "* The estimator should support 'feature_importances'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import load_boston"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [],
   "source": [
    "boston = load_boston()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LinearRegression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [],
   "source": [
    "clf = LinearRegression()\n",
    "sfm = feature_selection.SelectFromModel(clf, threshold=0.25)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(506, 7)"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sfm.fit_transform(boston.data, boston.target).shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(506, 13)"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "boston.data.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 12. Recursive Feature Elimination\n",
    "* Uses an external estimator to calculate weights of features\n",
    "* First, the estimator is trained on the initial set of features and the importance of each feature is obtained either through a coef_ attribute or through a feature_importances_ attribute. \n",
    "* Then, the least important features are pruned from current set of features. \n",
    "* That procedure is recursively repeated on the pruned set until the desired number of features to select is eventually reached."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import make_regression\n",
    "from sklearn.feature_selection import RFE\n",
    "from sklearn.svm import SVR\n",
    "X, y = make_regression(n_samples=50, n_features=10, random_state=0)\n",
    "estimator = SVR(kernel=\"linear\")\n",
    "selector = RFE(estimator, 5, step=1)\n",
    "data = selector.fit_transform(X, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(50, 10)"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(50, 5)"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 1, 4, 3, 1, 6, 1, 2, 5, 1])"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "selector.ranking_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
